import assert, { AssertionError } from 'assert'

(function () {
  // # 类型断言守卫
  let name: any = 'lys';

  try {
    assert(typeof name === 'number');
    // number 类型
    name.toFixed();
  } catch (error: any) {
    console.log(error.message);
  }


  //这里使用的是 asserts condition ，而 condition 来自于实际逻辑！这也意味着，我们将 condition 这一逻辑层面的代码，作为了类型层面的判断依据，相当于在返回值类型中使用一个逻辑表达式进行了类型标注。
  function assert1(condition: any, msg?: string): asserts condition {
    if (!condition) {
      throw new Error(msg)
    }
  }

  //这里的 condition 甚至还可以结合使用 is 关键字来提供进一步的类型守卫能力：

  function assertIsNumber(val: any): asserts val is number {
    if (typeof val !== 'number') {
      // throw new Error('Not a number')
      console.error('Not a number');
    }
  }

  assertIsNumber(name)

  // number 类型
  // name.toFixed()
}())


